import { app, BrowserWindow, ipcMain, dialog } from 'electron'
import { autoUpdater,CancellationToken } from 'electron-updater'
import log from 'electron-log';

 
// 检测更新，在你想要检查更新的时候执行，renderer事件触发后的操作自行编写
export function updateHandle({ mainWindow }) {
  //                            清除每次更新下载的文件，否则无法进行更新
  //= ==============================================================================================================
  // updaterCacheDirName的值与src/main/app-update.yml中的updaterCacheDirName值一致，在windows中会创建一个类似
  // C:\Users\Administrator\AppData\Local\slient-print-updater\pending文件存储更新下载后的文件"*.exe"和"update-info.json"
//   let updaterCacheDirName = 'slient-print-updater'
//   const updatePendingPath = path.join(autoUpdater.app.baseCachePath, updaterCacheDirName, 'pending')
//   fs.emptyDir(updatePendingPath)
  let message = {
    error: '检查更新出错',
    checking: '正在检查更新……',
    updateAva: '检测到新版本，正在下载……',
    updateNotAva: '现在使用的就是最新版本，不用更新'
  }

  let isDownloadCancelled = false;
  let checkUpdateByClick = false 
  let cancellationToken = new CancellationToken()

  function sendUpdateMessage(text,type) {
    log.info(text)
    if(checkUpdateByClick){
      try{
        mainWindow?.webContents.send('checkMessage', type)

      }catch{}
    }
}


  // 也可以通过代码配置文件服务地址
   autoUpdater.setFeedURL("https://nfbim.sepco1.com/packages")
  // 设置是否自动下载，默认是true,当点击检测到新版本时，会自动下载安装包，所以设置为false
  autoUpdater.autoDownload = false
  // 正在检查更新
  autoUpdater.on('error', function (error) {
    log.info({error})
    sendUpdateMessage(message.error,5)
  })
  autoUpdater.on('checking-for-update', function () {
    sendUpdateMessage(message.checking,2)
  })
  // 有新的可用更新
  autoUpdater.on('update-available', function (info) {
    log.info({info})
    if(checkUpdateByClick){

        sendUpdateMessage(message.updateAva,4)

    }else{
      try{
        mainWindow?.webContents.send('update-check');

      }catch{}

    }
  })
  //  没有可用的更新，也就是当前是最新版本
  autoUpdater.on('update-not-available', function (info) {
    sendUpdateMessage(message.updateNotAva,3)
  })
 
  // 更新下载进度事件
  autoUpdater.on('download-progress', function (progressObj) {
    log.info({progressObj})

    if (isDownloadCancelled) {
      
      cancellationToken.cancel()

      // mainWindow.webContents.send('downloadEnd', true)
      

      try{
        mainWindow.webContents.send('downloadProgress', {percent:0})

      }catch{}

        // 停止下载操作
        return false;
      }

    
    try{
      mainWindow.webContents.send('downloadProgress', progressObj)

    }catch{}
  })
  // 新安装包下载完成
  autoUpdater.on('update-downloaded', function (
    event,
    releaseNotes,
    releaseName,
    releaseDate,
    updateUrl,
    quitAndUpdate
  ) {
    try{
      mainWindow.webContents.send('downloadEnd', true)

    }catch{}

    // ipcMain.on('isUpdateNow', (e, arg) => {
      log.info('开始更新')
      if(isDownloadCancelled){
        return 
      }else{
        autoUpdater.quitAndInstall()
      }
    // })
 
    // mainWindow.webContents.send('isUpdateNow')
  })
 
  ipcMain.on('downloadUpdate', () => {
    // 下载
    log.info('执行下载')
    try{
      mainWindow.webContents.send('downloadEnd', false)

    }catch{}
    autoUpdater.downloadUpdate(cancellationToken)
    
  })

  ipcMain.on('downloadUpdate2', () => {
    // 下载
    log.info('执行下载-手动')
    isDownloadCancelled= false
    cancellationToken = new CancellationToken()
    try{
      mainWindow.webContents.send('downloadEnd', false)

    }catch{}
    autoUpdater.downloadUpdate(cancellationToken)
    
  })

  ipcMain.on('quitDownload', () => {
    // 下载
    log.info('中断下载')
    isDownloadCancelled = true;
    
  })

  ipcMain.on('checkUpdate', () => {
    // 下载
    checkUpdateByClick=true

    log.info('手动检查更新')
    isDownloadCancelled= false
    cancellationToken = new CancellationToken()
    autoUpdater.checkForUpdates()

  })

  autoUpdater.checkForUpdates()
  checkUpdateByClick=false

}
 
// 通过main进程发送事件给renderer进程，提示更新信息
